package com.langchain4j.core.flow.node;

import com.langchain4j.core.flow.context.NodeContext;
import com.langchain4j.core.flow.result.NodeResult;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 流程节点抽象类
 */
@Data
@EqualsAndHashCode(callSuper = false)
public abstract class FlowNode {
    
    /**
     * 节点ID
     */
    protected String id;
    
    /**
     * 节点名称
     */
    protected String name;
    
    /**
     * 节点类型
     */
    protected NodeType type;
    
    /**
     * 节点配置
     */
    protected Map<String, Object> config;
    
    /**
     * 节点描述
     */
    protected String description;
    
    /**
     * 执行节点
     * @param context 节点上下文
     * @return 执行结果
     */
    public abstract CompletableFuture<NodeResult> execute(NodeContext context);
    
    /**
     * 验证节点配置
     * @return 是否有效
     */
    public abstract boolean validate();
    
    /**
     * 获取节点输入参数
     * @return 输入参数列表
     */
    public abstract Map<String, Object> getInputSchema();
    
    /**
     * 获取节点输出参数
     * @return 输出参数列表
     */
    public abstract Map<String, Object> getOutputSchema();
    
    /**
     * 节点类型枚举
     */
    public enum NodeType {
        LLM_CALL("LLM调用"),
        CONDITION("条件判断"),
        DATA_PROCESS("数据处理"),
        API_CALL("API调用"),
        STORAGE("数据存储"),
        LOOP("循环"),
        PARALLEL("并行执行"),
        DELAY("延时"),
        LOG("日志"),
        VARIABLE("变量操作");
        
        private final String description;
        
        NodeType(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }
} 